home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / os30 / gfx / animdemo.lha / sprites.c < prev    next >
C/C++ Source or Header  |  1993-01-22  |  4KB  |  137 lines

  1. /*******************************************************************************
  2.  *
  3.  * (c) Copyright 1993 Commodore-Amiga, Inc.  All rights reserved.
  4.  *
  5.  * This software is provided as-is and is subject to change; no warranties
  6.  * are made.  All use is at your own risk.  No liability or responsibility
  7.  * is assumed.
  8.  *
  9.  * sprites.c - allocates sprites and handles sprite movements.
  10.  *
  11.  ******************************************************************************/
  12.  
  13. #include <exec/types.h>
  14. #include <graphics/sprite.h>
  15. #include <intuition/pointerclass.h>
  16. #include <intuition/classes.h>
  17. #include <intuition/classusr.h>
  18. #include <intuition/screens.h>
  19. #include <proto/graphics.h>
  20. #include <proto/intuition.h>
  21. #include <stdio.h>
  22.  
  23. #include "playanim.h"
  24. #include "sprites.h"
  25. #include "stick.h"
  26.  
  27. extern struct BitMap XHairBitMap;
  28. extern struct BitMap MissileBitMap;
  29.  
  30. APTR InitXHair(void)
  31. {
  32.     /* For the main Cross-hair cursor, use intuition's pointer. NewObject()
  33.      * of the POINTERCLASS informs intuition that we want to change the
  34.      * pointer imagery, width and resolution.
  35.      */
  36.  
  37.     APTR XHair;
  38.  
  39.     XHair = NewObject(NULL, POINTERCLASS, 
  40.                       POINTERA_BitMap, &XHairBitMap,
  41.                          POINTERA_XOffset, XHAIRXOFFSET,
  42.                       POINTERA_YOffset, XHAIRYOFFSET,
  43.                       POINTERA_WordWidth, XHAIRWIDTH,
  44.                       POINTERA_XResolution, SPRITE_XRESN,
  45.                       POINTERA_YResolution, SPRITE_YRESN,
  46.                       TAG_END);
  47.  
  48.     return(XHair);
  49. }
  50.  
  51. BOOL InitMissiles(struct Missile *Missile, struct ExtSprite *Sprites[])
  52. {
  53.     LONG num;
  54.     BOOL error = FALSE;
  55.     int i;
  56.  
  57.     for (i = 0; ((i < SPRITE_COUNT) && !error); i++)
  58.     {
  59.     if ((Sprites[i] = AllocSpriteData(&MissileBitMap,
  60.                                      SPRITEA_Width, MISSILEWIDTH,
  61.                                      TAG_END)) == NULL)
  62.     {
  63.         error = TRUE;
  64.     }
  65.     }
  66.  
  67.     if (error)
  68.     {
  69.     for (i = 0; i < SPRITE_COUNT; i++)
  70.     {
  71.         if (Sprites[i])
  72.         {
  73.             FreeSpriteData(Sprites[i]);
  74.             Sprites[i] = NULL;
  75.         }
  76.     }
  77.     return(FALSE);
  78.     }
  79.  
  80.     /* start with the first missile image. */
  81.     Missile->mis_Sprite = Sprites[0];
  82.     num = GetExtSprite(Missile->mis_Sprite,
  83.                    GSTAG_SPRITE_NUM, MISSILESPRITENUM,
  84.                    TAG_END);
  85.     for (i = 0; i < SPRITE_COUNT; i++)
  86.     {
  87.     Sprites[i]->es_SimpleSprite.num = num;
  88.     }
  89.     if (num == -1)
  90.     {
  91.     return(FALSE);
  92.     }
  93.  
  94.     return(TRUE);
  95. }
  96.  
  97. #define MISSILECOUNT 8
  98. #define MISSILE_X_ORIGIN (input->Screen->Width >> 1)
  99. #define MISSILE_Y_ORIGIN (input->Screen->Height)
  100.  
  101. void FireMissile(struct Input *input)
  102. {
  103.     struct Missile *Missile = input->Missiles;
  104.  
  105.     if (!(Missile->mis_Active))
  106.     {
  107.     Missile->mis_StartX = input->Vista->vs_CamX;
  108.     Missile->mis_StartY = input->Vista->vs_CamY;
  109.     Missile->mis_StartZ = input->Vista->vs_CamZ;
  110.     Missile->mis_StartPitch = input->Vista->vs_Pitch;
  111.     MoveSprite(&input->Screen->ViewPort, &Missile->mis_Sprite->es_SimpleSprite, MISSILE_X_ORIGIN, MISSILE_Y_ORIGIN);
  112.     Missile->mis_Active = MISSILECOUNT;
  113.     }
  114. }
  115.  
  116. void FireAudio(struct Input *input);
  117.  
  118. void MoveMissile(struct Input *input)
  119. {
  120.     struct Missile *Missile = input->Missiles;
  121.     WORD XPos, YPos;
  122.     WORD time;
  123.  
  124.     if (--Missile->mis_Active)
  125.     {
  126.     time = (MISSILECOUNT - Missile->mis_Active);
  127.         XPos = (MISSILE_X_ORIGIN + (((input->Screen->MouseX - MISSILE_X_ORIGIN) * time) / MISSILECOUNT));
  128.         YPos = (MISSILE_Y_ORIGIN + (((input->Screen->MouseY - MISSILE_Y_ORIGIN) * time) / MISSILECOUNT));
  129.     MoveSprite(&input->Screen->ViewPort, &Missile->mis_Sprite->es_SimpleSprite, XPos, YPos);
  130.     FireAudio(input);
  131.     }
  132.     else
  133.     {
  134.     MoveSprite(&input->Screen->ViewPort, &Missile->mis_Sprite->es_SimpleSprite, -100, -100);
  135.     }
  136. }
  137.